package spring.cloud.tasks.executor.utils.zookeeper;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.state.ConnectionStateListener;

import java.util.List;

/**
 * 注册中心.
 */
public interface Zookeeper {

    /**
     * 初始化注册中心.
     */
    void init();

    /**
     * 是否己连上
     *
     * @return
     */
    boolean isConnected();

    /**
     * 获取会话超时时间
     *
     * @return 会话超时时间
     */
    long getSessionTimeoutMs();

    /**
     * 获取注册中心当前时间.
     *
     * @param path 用于获取时间的键
     * @return 注册中心当前时间
     */
    long getCtime(String path);

    /**
     * 直接获取操作注册中心的原生客户端. 如：Zookeeper或Redis等原生客户端.
     *
     * @return 注册中心的原生客户端
     */
    CuratorFramework getCuratorFramework();

    /**
     * 关闭注册中心.
     */
    void close();

    /**
     * 持久化注册数据.
     *
     * @param path  键
     * @param value 值
     */
    void persist(String path, String value);

    /**
     * 持久化临时注册数据.
     *
     * @param path  键
     * @param value 值
     */
    void persistEphemeralDataNode(String path, String value);

    /**
     * 持久化临时顺序注册数据.
     *
     * @param path 键
     */
    void persistEphemeralSequentialDataNode(String path);

    /**
     * 更新注册数据.
     *
     * @param path  键
     * @param value 值
     */
    void setData(String path, String value);

    /**
     * 删除注册数据.
     *
     * @param path 键
     */
    void delete(String path);

    /**
     * 获取数据是否存在.
     *
     * @param path 键
     * @return 数据是否存在
     */
    boolean checkExists(String path);

    /**
     * 获取注册数据.
     *
     * @param path 键
     * @return 值
     */
    String getData(String path);

    /**
     * 获取子节点名称集合.
     *
     * @param path 键
     * @return 子节点名称集合
     */
    List<String> getChildrenList(String path);


    /**
     * 使用基于namespace的客户端，如果namespace为null，则视为不使用namespace
     *
     * @param namespace
     * @return
     */
    ZookeeperImpl usingNamespace(String namespace);

    /**
     * 获取namespace
     */
    String getNameSpace();

    /**
     * 获取executorName
     */
    String getExecutorId();

    /**
     * 设置executorName
     */
    void setExecutorId(String executorId);

    /**
     * 添加连接状态变更事件监听
     */
    void addConnectionStateListener(ConnectionStateListener connectionStateListener);

    /**
     * 删除连接状态变更事件监听
     */
    void removeConnectionStateListener(ConnectionStateListener connectionStateListener);


}
